昨天我們實作了 Cookie + Session Authentication,體驗到「伺服器會記住使用者狀態」,用從設定,到測試,會發現程式不用寫太多,資料都會記在瀏覽器裡面,使用起來很方便。
但問題來了:
這些問題在大型系統裡非常常見,於是工程師們開始思考:
能不能把「使用者狀態」交給用戶端自己保存,而不是伺服器?
這就是 Token Authentication 的起點。
Token(憑證)是一串伺服器簽發的「隨機字串」或「加密字串」。
使用者登入成功 → 伺服器產生一個 Token。
Token 傳給用戶端(瀏覽器 / App)。
用戶端每次呼叫 API,都在 Header 帶上 Token:
Authorization: Bearer <token>
伺服器驗證 Token 是否有效,通過就放行。
當你了解了Token的機制,第一件事情一定是拿來跟Session比較,那我們也來弄成一個表格給大家參考:
機制 | Session Authentication | Token Authentication |
---|---|---|
狀態保存 | 伺服器(Session ID → 狀態) | 用戶端(Token 自帶資訊 or 驗證) |
擴展性 | 不利分散式(需要 Session 同步) | 適合分散式(每台伺服器都能驗證 Token) |
登出機制 | 可以直接刪除 Session | Token 一旦發出去 → 直到過期前都有效 |
安全性 | Cookie 自動附帶(易受 CSRF 攻擊) | Token 通常放在 Header(避免 CSRF) |
常見應用 | 傳統網站登入(Java Web, PHP, ASP.NET) | 行動 App、API、前後端分離架構 |
簡單來說:Session Authentication 就是讓伺服器記住你,而Token Authentication 則是讓你自己帶證明。
用比較生活的比喻,Session 像是去餐廳用餐,服務生會幫你「記住」桌號,每次點菜只要報桌號即可。而Token 像是演唱會入場券,票上有你的座位資訊,每次進場都要出示票,場館不用特別記錄你。當然,一個機制有優點,一定就會有缺點,讓我們來詳細的分析一下:
在這裡大家可能還是有點不理解,什麼是「沒過期就能一直使用」,這邊需要解釋一下,Token裡面會有著有效期限,但如果在過程中,有人盜用了這個Token,我們也馬上知道了,卻沒有辦法阻止驗證,因為Token是使用者自帶,Server端只負責解密,確認有辦法解出來,角色有這些權限。
所以後來出現了 JWT(JSON Web Token) —— 一種「自帶資訊」又能驗證真假的 Token 格式。
JSESSIONID
辨識。今天就到這裡,明天,我們會示範無狀態請求的運作方式:
明天見!